from flask import Flask, make_response, request, session, redirect, url_for, abort, views, jsonify

app = Flask(__name__)


# 在第一次请求调用之前调用，可以在此方法内部做一些初始化操作
@app.before_first_request
def before_first_request():
    print("before_first_request")

# 在每一次请求调用之前调用，这个时候已经有请求了，可以在这个方法里面做请求的校验
# 如果请求的校验不成功，可以直接在此方法中进行响应，直接return,之后就不会再执行视图函数
@app.before_request
def before_request():
    print("before_request")
    # if 请求不符合条件：
    #   return "laowangba"


# 在执行完视图函数之后调用，并且会把视图函数所生成的响应传入，可以在次方法中对响应做最后一步的统一处理
@app.after_request
def after_request(response):
    print("after_request")
    response.headers["Content-Type"] = "application/json"
    return response

# 每次请求之后都会调用，会接受一个参数，参数是服务器出现的错误信息
@app.teardown_request
def teardown_request(e):
    print("teardown_request")
    print(e)


@app.route("/")
def index():
    return "demo2 index page"

print('*'*30+'cookie知识')

@app.route('/cookie')
def set_cookie():
    resp = make_response("this is to set cookie")
    resp.set_cookie("token","abacdadaf")
    return resp


@app.route('/cookies')
def set_cookies():
    resp = make_response("this is to set cookies && max_age")
    resp.set_cookie("token","qwertyuiop",max_age=300)
    return resp

@app.route('/getcookie')
def resp_cookie():
    resp = request.cookies.get('token')
    return resp
# 可以结合中间件处理 比如在每次响应的时候设置cookie

app.config["SECRET_KEY"] = '20180706'

@app.route('/session')
def setsession():
    session['username'] = 'DDD'
    return redirect(url_for('index'))

@app.route('/getsession')
def session2():
    return session.get('username')


@app.route("/json")
def json():
    json_dict = {
        "user_id":1001,
        "user_name":"laowang"
    }

    return jsonify(json_dict)


# =============================不同的视图返回形式=======================================

# FBV

def fbv():
    return "FBV"
app.add_url_rule('/fbv',endpoint='fbv',view_func=fbv)

# class Index1(views.View):
#     methods = ['get']
#     decorators = [wapper,]








if __name__ == '__main__':
    app.run(port=8888)